🆕 程式碼
1) src/day28_xlingual.js
// src/day28_xlingual.js
import { openai } from "./aiClient.js";
import { answerWithRAG } from "./day16_rag_store.js";
/**
 * 偵測語言 + 翻譯查詢
 */
export async function translateQuery(query, targetLang="en") {
  const res = await openai.chat.completions.create({
    model: "gpt-4o-mini",
    temperature: 0,
    messages: [
      { role: "system", content: "你是一個翻譯器,請將輸入翻譯成 " + targetLang + ",保持原意。" },
      { role: "user", content: query }
    ]
  });
  return res.choices?.[0]?.message?.content?.trim() || query;
}
/**
 * 跨語言檢索
 */
export async function retrieveXlingual({ tenant, ns, query, topK=6 }) {
  // 1) 翻譯查詢成英文
  const queryEn = await translateQuery(query, "en");
  // 2) 原文檢索
  const { sources: srcOrig } = await answerWithRAG({ tenant, ns, query, topK });
  // 3) 英文檢索
  const { sources: srcEn } = await answerWithRAG({ tenant, ns, query: queryEn, topK });
  // 4) 合併去重
  const seen = new Map();
  [...srcOrig, ...srcEn].forEach(s => {
    if (!seen.has(s.id)) seen.set(s.id, s);
  });
  return [...seen.values()].slice(0, topK);
}
新增 xlingual 策略:
import { retrieveXlingual } from "../../../../../src/day28_xlingual.js";
...
  if (strategy === "xlingual") {
    const chunks = await retrieveXlingual({ tenant, ns, query: q, topK: 6 });
    const ctxText = chunks.map((h,i)=>`# 片段${i+1}(${h.docId})\n${h.text}`).join("\n\n");
    const res = await openai.chat.completions.create({
      model:"gpt-4o-mini",
      temperature:0.2,
      messages:[
        { role:"system", content:"你是多語言知識庫助理,根據片段回答,並保持使用者輸入語言回答。" },
        { role:"user", content:`問題:${q}\n\n片段:\n${ctxText}` }
      ]
    });
    const answer = res.choices?.[0]?.message?.content?.trim() || "沒有足夠資訊。";
    return NextResponse.json({ ok:true, strategy:"xlingual", answer, sources: chunks });
  }
選單多一個策略:
<select ... value={strategy} onChange={e=>setStrategy(e.target.value as any)}>
   <option value="default">Default(Top-K)</option>
   <option value="section">Section-first</option>
   <option value="qrewrite">Query Rewrite</option>
   <option value="hybrid">Hybrid</option>
   <option value="rerank">Rerank</option>
+  <option value="xlingual">X-Lingual(跨語言)</option>
</select>
▶️ 驗收流程
/studio 切到 X-Lingual 模式。
知識庫假設是英文檔案。
提問(中文):「退貨需要多久?」
系統會翻譯成英文 → 同時檢索英文與中文版本。
最後回答仍然是中文。
回傳 JSON:strategy: "xlingual"。